from __future__ import absolute_import, division, print_function, unicode_literals

# TensorFlow and tf.keras
#from tensorflow import keras
import numpy as np
from tensorflow import keras
from flask import Flask, escape, request
import matplotlib.image as mp
import tensorflow as tf

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

# 设置中文显示，防止中文显示乱码
from pylab import mpl

app = Flask(__name__)

mpl.rcParams['font.sans-serif'] = ['FangSong']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 加载数据集
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

# 以下用于创建模型

# 下面的代码很显然存在三层,
# 其中第一层是tf.keras.layers.Flatten(),主要的功能就是将(28,28)像素的图像即对应的2维的数组转成28*28=784的一维的数组.
# 第二层是Dense,如果你上过吴恩达的课程,或者有一点机器学习的基础的话,这个可以理解成全连接层,这个层存在128的神经元.
# 最后一层是softmax层,它返回的是由10个概率值(加起来等于1)组成的1维数组,每一个代表了这个图像属于某个类别的概率.
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 每个图像都映射到一个标签
class_names = ['T恤/上衣', '裤子', '套衫', '连衣裙', '外套',
               '凉鞋', '衬衫', '运动鞋', '包/袋', '脚踝靴']

def buildModel():
    # 图像归一化
    # 将矩阵存储的整数（0，255）归一化到（0，1）的浮点数
    global train_images
    global test_images
    train_images = train_images / 255.0
    test_images = test_images / 255.0

    # 以下用于创建模型

    global model
    # 以下用于编译模型

    # 优化器是AdamOptimizer(表示采用何种方式寻找最佳答案,有什么梯度下降啊等等),
    # 损失函数是sparse_categorical_crossentropy(就是损失函数怎么定义的,最佳值就是使得损失函数最小).
    # 计量标准是准确率,也就是正确归类的图像的概率.
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    # 调用函数开始训练，epochs指定训练次数
    model.fit(train_images, train_labels, epochs=1)

    # 在测试集上完成准确率的评估,
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
    print('\nTest accuracy:', test_acc)  # 输出准确率

def prediction(img):
    #global test_images
    # 进行预测
    global model
    graph = tf.get_default_graph()
    print(img)
    img = (np.expand_dims(img, 2))
    img = (np.expand_dims(img, 0))
    with graph.as_default():
        predictions_single = model.predict(img)
    label = np.argmax(predictions_single[0])
    return str(class_names[label])

@app.route('/test1', methods=['GET', 'POST'])
def hello_world():

    file = request.files.get('file')
    img = mp.imread(file)

    return prediction(img)


if __name__ == '__main__':
    buildModel()
    app.run(host='0.0.0.0', port=5000)
